type ClassValue = string | number | boolean | null | undefined | Record<string, boolean> | Array<ClassValue>;

/**
 * 条件性组合类名工具函数
 * 支持字符串、数组和对象三种类型的参数
 * 对象形式时会根据值的真假来决定是否包含对应的键名
 * 数组形式时会递归展开处理
 * @param {...ClassValue} args - 类名参数列表
 * @returns {string} 组合后的类名字符串
 * @example
 * cn('foo', { bar: true, baz: false }, ['qux', { quux: true }]) => 'foo bar qux quux'
 */
export function cn(...args: ClassValue[]): string {
  return args
    .map((arg) => {
      if (Array.isArray(arg)) return cn(...arg);
      if (typeof arg === 'object' && !Array.isArray(arg)) {
        return Object.entries(arg as Record<string, boolean>)
          .filter(([, condition]) => condition)
          .map(([className]) => className)
          .join(' ');
      }
      return arg || '';
    })
    .join(' ')
    .trim();
}
